<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
	<xsl:variable name="lowerCase" select="'abcdefghijklmnopqrstuvwxyz'"/>
	<xsl:variable name="upperCase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
	<xsl:template match="/">
		<xsl:element name="UMLEditor">
			<xsl:attribute name="exporter"><xsl:value-of select="XMI/XMI.header/XMI.documentation/XMI.exporter"/></xsl:attribute>
			<xsl:attribute name="version"><xsl:value-of select="XMI/XMI.header/XMI.metamodel/@xmi.version"/></xsl:attribute>
			<xsl:apply-templates select="XMI/XMI.content"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="XMI.content">
		<xsl:element name="Model">
			<!-- Package -->
			<xsl:apply-templates select="Model"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="Model">
		<!-- Package -->
		<xsl:apply-templates select="." mode="Package"/>
		<!-- Les relations -->
		<xsl:apply-templates select="." mode="Relations"/>
	</xsl:template>
	<!-- Package -->
	<xsl:template match="Model" mode="Package">
		<xsl:element name="Package">
			<!-- nom -->
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<!-- documentation -->
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			
			<!-- les classes -->
			<xsl:apply-templates select="//Class[@xmi.id]" mode="Init" />
			<!-- classe d'association -->
			<xsl:apply-templates select="//AssociationClass[@xmi.id]" mode="AssociationClass"/>
			<!-- interfaces -->
			<xsl:apply-templates select="//Interface[@xmi.id]" mode="Interface"/>
		</xsl:element>
	</xsl:template>
	<!-- Les Classes -->
	<xsl:template match="Class" mode="Init">
		<xsl:variable name="isAssociationClass">
			<xsl:call-template name="IsAssociationClass">
				<xsl:with-param name="id" select="@xmi.id" />
			</xsl:call-template>
		</xsl:variable>
		
		<xsl:variable name="E_stereotype">
			<xsl:element name="Stereotype">
				<xsl:call-template name="AttributeStereotype">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
			</xsl:element>
		</xsl:variable>
		
		<xsl:variable name="stereotype">
			<xsl:value-of select="msxsl:node-set($E_stereotype)/Stereotype/@stereotype"/>
		</xsl:variable>
		
		<xsl:choose>
			<!-- AssociationClass -->
			<xsl:when test="$isAssociationClass='true'">
				<xsl:apply-templates select="." mode="AssociationClass"/>
			</xsl:when>
			<!-- Enumeration -->
			<xsl:when test="translate($stereotype,$upperCase,$lowerCase)='enumeration'">
				<xsl:apply-templates select="." mode="Enumeration"/>
			</xsl:when>
			<!-- Singleton -->
			<xsl:when test="translate($stereotype,$upperCase,$lowerCase)='singleton'">
				<xsl:apply-templates select="." mode="Singleton"/>
			</xsl:when>
			<!-- Interface -->
			<xsl:when test="translate($stereotype,$upperCase,$lowerCase)='interface'">
				<xsl:apply-templates select="." mode="Interface"/>
			</xsl:when>
			<!-- classe "normale" -->
			<xsl:otherwise>
				<xsl:apply-templates select="." mode="Class"/>
			</xsl:otherwise>
		</xsl:choose>
		
	</xsl:template>
	
	<!-- Les Enumeration -->
	<xsl:template match="Class" mode="Enumeration">
		<xsl:element name="Enumeration">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="final">???</xsl:attribute>
			<!-- Literal -->
			<xsl:apply-templates select="Classifier.feature/Attribute" mode="Literal"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="Attribute" mode="Literal">
		<xsl:element name="Property">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="type"/>
			<xsl:attribute name="visibility"/>
			<xsl:attribute name="static"/>
			<xsl:attribute name="defaultValue"/>
		</xsl:element>
	</xsl:template>
	<!-- Les Singleton -->
	<xsl:template match="Class" mode="Singleton">
		<xsl:element name="Class">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAbstract">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="final">???</xsl:attribute>
			<xsl:call-template name="AttributeStereotype">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="associationClass">false</xsl:attribute>
			<xsl:attribute name="isSingleton">true</xsl:attribute>
			<!-- Attributs -->
			<xsl:apply-templates select="Classifier.feature/Attribute[@xmi.id]" mode="Property"/>
		</xsl:element>
	</xsl:template>
	<!-- Les Classes -->
	<xsl:template match="Class" mode="Class">
		<xsl:element name="Class">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAbstract">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="final">false</xsl:attribute>
			<xsl:call-template name="AttributeStereotype">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="associationClass">false</xsl:attribute>
			<!-- Attributs -->
			<xsl:apply-templates select="Classifier.feature/Attribute" mode="Property"/>
			<!-- Operations -->
			<!--<xsl:apply-templates select="Classifier.feature/Operation" mode="Operation"/>-->
		</xsl:element>
	</xsl:template>
	<!-- Les Classes d'Association -->
	<xsl:template match="AssociationClass | Class" mode="AssociationClass">
		<xsl:element name="Class">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAbstract">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="final">false</xsl:attribute>
			<xsl:call-template name="AttributeStereotype">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="associationClass">true</xsl:attribute>
			<!-- Attributs -->
			<xsl:apply-templates select="Classifier.feature/Attribute[@xmi.id]" mode="Property"/>
			<!-- Operations -->
			<!--<xsl:apply-templates select="Classifier.feature/Operation[@xmi.id]" mode="Operation"/>-->
		</xsl:element>
	</xsl:template>
	<!-- Attributs -->
	<xsl:template match="Attribute" mode="Property">
		<xsl:variable name="E_name">
			<xsl:element name="Name">
				<xsl:call-template name="AttributeName">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
			</xsl:element>
		</xsl:variable>
		<xsl:variable name="attributeName">
			<xsl:value-of select="msxsl:node-set($E_name)/Name/@name"/>
		</xsl:variable>
		<xsl:if test="not( starts-with($attributeName, 'lnk'))">
			<xsl:element name="Property">
				<xsl:call-template name="AttributeName">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
				<xsl:call-template name="AttributeDocumentation">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
				<xsl:call-template name="AttributeType">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
				<xsl:call-template name="AttributeVisibility">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
				<xsl:attribute name="static">???</xsl:attribute>
				<xsl:call-template name="AttributeDefaultValue">
					<xsl:with-param name="node" select="."/>
				</xsl:call-template>
			</xsl:element>
		</xsl:if>
	</xsl:template>
	<!-- Operations -->
	<xsl:template match="Operation" mode="Operation">
		<xsl:element name="Operation">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeType">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="static">???</xsl:attribute>
			<xsl:attribute name="modifier">m_none</xsl:attribute>
			<xsl:attribute name="code"/>
			<xsl:call-template name="ElementParameter">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
		</xsl:element>
	</xsl:template>
	<!-- Interface -->
	<xsl:template match="Interface | Class" mode="Interface">
		<xsl:element name="Interface">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeVisibility">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="final">???</xsl:attribute>
			<!-- Attributs -->
			<xsl:apply-templates select="Classifier.feature/Attribute[@xmi.id]" mode="Property"/>
			<!-- Operations -->
			<!--<xsl:apply-templates select="Classifier.feature/Operation[@xmi.id]" mode="Operation"/>-->
		</xsl:element>
	</xsl:template>
	<!-- Relations -->
	<xsl:template match="Model" mode="Relations">
		<!-- Héritage -->
		<xsl:apply-templates select="//Generalization[@xmi.id]"/>
		<!-- Implémentation -->
		<xsl:apply-templates select="//Abstraction[@xmi.id]" mode="Implementation"/>
		<xsl:apply-templates select="//Dependency[@xmi.id]" mode="Implementation" />
		<!-- Association -->
		<xsl:apply-templates select="//Association[@xmi.id]" mode="Association"/>

    <xsl:apply-templates select="//AssociationClass[@xmi.id]" mode="AssociationClassifier"/>
		
	</xsl:template>
	
	<xsl:template match="Association" mode="Association">
		<xsl:variable name="isAssociationClassifier">
			<xsl:call-template name="IsAssociationClassifier">
				<xsl:with-param name="node" select="." />
			</xsl:call-template>
		</xsl:variable>
		
		<xsl:choose>
			<xsl:when test="$isAssociationClassifier='true'">
				<xsl:apply-templates select="." mode="AssociationClassifier"/>
			</xsl:when>
			<xsl:otherwise>
			
		<xsl:element name="Association">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAssociationType">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeNavigable">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="associationClassifier"/>
			<xsl:call-template name="AttributeClientClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientRole">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientMultiplicity">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="clientQualifierName"/>
			<xsl:attribute name="clientQualifierType"/>
			<xsl:call-template name="AttributeSupplierClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierRole">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierMultiplicity">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="supplierQualifierName"/>
			<xsl:attribute name="supplierQualifierType"/>
		</xsl:element>
		</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<xsl:template match="AssociationClass | Association" mode="AssociationClassifier">
		<xsl:element name="Association">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAssociationType">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeNavigable">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeAssociationClassifier">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientRole">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientMultiplicity">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="clientQualifierName"/>
			<xsl:attribute name="clientQualifierType"/>
			<xsl:call-template name="AttributeSupplierClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierRole">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierMultiplicity">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:attribute name="supplierQualifierName"/>
			<xsl:attribute name="supplierQualifierType"/>
		</xsl:element>
	</xsl:template>
	<!-- l'héritage -->
	<xsl:template match="Generalization" mode="Generalization">
		<xsl:element name="Generalization">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
		</xsl:element>
	</xsl:template>
	<!-- l'implémentation -->
	<xsl:template match="Generalization" mode="Implementation">
		<xsl:element name="Implementation">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
		</xsl:element>
	</xsl:template>
	<!-- l'implémentation -->
	<xsl:template match="Abstraction" mode="Implementation">
		<xsl:element name="Implementation">
			<xsl:call-template name="AttributeName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeDocumentation">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeClientClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
			<xsl:call-template name="AttributeSupplierClassName">
				<xsl:with-param name="node" select="."/>
			</xsl:call-template>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>
